home *** CD-ROM | disk | FTP | other *** search
- .386p
- code32 segment para public use32
- assume cs:code32, ds:code32
-
- include pmode.inc
- include gsp669.inc
- include vect3.inc
- include kb.inc
- include v.inc
-
- public _p3
-
- ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
- ; DATA
- ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
- align 4
- BALLSLEN = 127000
-
- MUZLOC0 = 0c00h
-
- ballstblptr dd ? ; ptrs to balls addx table
- ballsoldptr dd ?,? ; erase areas buffer ptrs
- ballsvidptrcur dd ? ; current video page ptr
- ballsoldptrcur dd ? ; current erase areas buffer ptr
- ballsdestpalptr dd ? ; ptr to pal to slide to
-
- fallbgptr dd ? ; ptr to bg for falling pieces
- fallpicptr dd ?,?,?,? ; ptrs to falling pics
- fallrout dd p3m0r4d,p3m0r4c,p3m0r4b,p3m0r4a
-
- p3m0seqrout dd p3m0sr0 ; sequence routine for glass balls
- p3m0rout dd _ret,p3m0r2,p3m0r1
- p3m0r1rout label dword ; entry points in ball raster put code
- irp temp,<16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
- dd p3m0r1l0f0+&temp*P3M0R1LEN
- endm
- p3m0r2rout label dword ; entry points in other ball put code
- irp temp,<16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
- dd p3m0r2l0f0+&temp*P3M0R2LEN
- endm
-
- ballsrot dw 0,0,0
- ballscoords dw 5, 0,80,0, 76,25,0, 47,-65,0, -47,-65,0, -76,25,0
- ballscoordsrot dw ?, 5*5 dup(?)
- ballsdata dw 5*2 dup(?)
-
- vrtcntr db 0
- ovrtcntr db 0
-
- ballspageindex db 1 ; glass balls page index
- ballspagetbl db 0,40h ; glass balls page offset table
- ballsoldnum db 0,0 ; number of erase areas in buffer
- ballsnumcur db ? ; current number of erase areas
- ballscoloradd db ? ; add to color when drawing ball
- ballsputrout db 5 dup(0) ; routine to put ball
- ballscolor db 5 dup(40h),? ; table of colors to add for each ball
- ballsindex db 5 ; index of ball being worked on
- ballszdelta db 0 ; current Z offset delta
- ballsydelta db 0 ; current Y offset delta
- ballsxdelta db 0 ; current X offset delta
- ballsdeltawait db 0 ; counter for delta change
-
- fallindex db 4 ; index of falling piece
- fallycntr db 0 ; Y size of falling piece
- fallxcntr db ? ; X size of falling piece
-
- ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
- ; CODE
- ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-
- ;═════════════════════════════════════════════════════════════════════════════
- p3ir0: ; only increment retrace timer
- inc vrtcntr
- ret
-
- ;═════════════════════════════════════════════════════════════════════════════
- p3ir1: ; set colors and slide
- cld
- push bx ecx esi edi
- mov edi,_cpalptr
- add edi,60h*3
- mov esi,edi
- mov dx,3c8h
- @outb 60h
- inc edx
- mov ecx,40h*3
- rep outsb
- mov esi,ballsdestpalptr
- mov ecx,40h*3
- mov bl,1
- call _slidebytes
- jnc short p3ir1f0
- mov _vrtrout,offset p3ir0
- p3ir1f0:
- inc vrtcntr
- pop edi esi ecx bx
- ret
-
- ;═════════════════════════════════════════════════════════════════════════════
- _p3:
- mov eax,'p30d' ; load and allocate data
- call _loaddata
- mov ballstblptr,eax
- add eax,BALLSLEN
- mov _v0r0sincosptr,eax
- ; add eax,1280
- ; mov fallbgptr,eax
-
- mov eax,6*4*2+160*100*4 +64000
- call _gethimem
- mov ballsoldptr[0],eax
- add eax,6*4
- mov ballsoldptr[4],eax
- add eax,6*4
- mov fallpicptr[0],eax
- add eax,160*100
- mov fallpicptr[4],eax
- add eax,160*100
- mov fallpicptr[8],eax
- add eax,160*100
- mov fallpicptr[12],eax
- add eax,160*100 ;
- mov fallbgptr,eax ;
-
- mov edi,eax ;
- mov ecx,16000 ;
- xor eax,eax ;
- rep stosd ;
-
- mov _v0r0perspective,100 ; set up rotation vars
- mov _v0r0tx,60
- mov _v0r0ty,20
- mov _v0r0tz,160
-
- mov dx,3ceh ; get 4 pics for fall into screen
- @outb 4
- inc edx
- mov edi,fallpicptr[0]
- xor esi,esi
- call p3i0r0
- mov edi,fallpicptr[4]
- mov esi,80*100+40
- call p3i0r0
- mov edi,fallpicptr[8]
- mov esi,40
- call p3i0r0
- mov edi,fallpicptr[12]
- mov esi,80*100
- call p3i0r0
-
- mov edi,_vidptr2 ; copy page 0 to page 2
- mov esi,_vidptr0
- mov dx,3c5h
- @outb 0fh
- mov dl,0ceh
- @outw 4105h
- mov ecx,4000h
- rep movsb
-
- mov edi,ballstblptr ; set up ball addresses
- mov ecx,63
- mov ebx,edi
- mov eax,edi
- p3i0l0:
- mov eax,[edi]
- add eax,ebx
- stosd
- loop p3i0l0
-
- mov edx,0a8000h ; set up selectors for zoom routine
- mov ax,_sel[0]
- call _setselector
- @php edx,fallpicptr[0]
- mov ax,_sel[2]
- call _setselector
-
- mov _vrtrout,offset p3ir0 ; set retrace timer routine
-
- mov edi,_cpalptr ; set up some colors
- lea esi,[edi+20h*3]
- add edi,0a0h*3
- mov ecx,40h
- p3i0l1:
- mov word ptr [edi],3f3fh
- mov byte ptr [edi+2],0
- add edi,3
- loop p3i0l1
- mov ecx,40h
- mov al,60h
- mov ah,vrtcntr
- waitl1:
- cmp ah,vrtcntr
- je waitl1
- call _setcpal
-
- mov dx,3ceh
- @outw 4005h
-
- ;═════════════════════════════════════════════════════════════════════════════
- ; Refracting glass balls
- p3m0:
- movzx ebx,ballspageindex ; set up some ptrs
- mov eax,_vidptr0[ebx*4]
- mov ballsvidptrcur,eax
- mov eax,ballsoldptr[ebx*4]
- mov ballsoldptrcur,eax
- mov ballsnumcur,0
-
- movzx ebp,fallindex ; put falling pieces
- cmp ebp,3
- ja p3m0f2
- movzx ebx,fallycntr
- dec bl
- mov fallycntr,bl
- imul eax,ebx,160
- mov ecx,100
- cdq
- idiv ecx
- mov fallxcntr,al
- call fallrout[ebp*4]
- movzx ecx,ballspageindex
- movzx edx,ballsoldnum[ecx]
- inc ballsoldnum[ecx]
- lea edx,[edx*4]
- add edx,ballsoldptr[ecx*4]
- mov [edx],ebx
- push eax
-
- mov dx,3c5h
- push esi
- push edi
- call p3m0r3
- pop edi
- inc edi
- call p3m0r3
- pop esi
- mov edi,esi
- add esi,fallbgptr
- add edi,_vidptr2
- mov al,11h
- p3m0l5:
- out dx,al
- mov ecx,40
- rep movsb
- sub edi,40
- add esi,80*200-40
- rol al,1
- jnc p3m0l5
-
- pop eax
- movzx ecx,fallycntr
- jecxz p3m0f2
- shl ecx,16
- mov cl,fallxcntr
- mov ebx,6400a0h
- movzx esi,fallindex
- imul esi,160*100
- xor edi,edi
- mov es,_sel[0]
- mov ds,_sel[2]
- call _psbm
- mov ax,cs:_seldata
- mov es,ax
- mov ds,ax
- p3m0f2:
-
- mov ebp,ballsvidptrcur ; erase old balls
- mov dx,3c5h
- @outb 0fh
- mov dl,0ceh
- @outw 4105h
- mov edx,ballsoldptrcur
- movzx ebx,ballspageindex
- mov bl,ballsoldnum[ebx]
- call p3m0r0
- p3m0f0:
-
- movsx eax,ballszdelta ; move balls on Z, Y, and X
- add _v0r0tz,ax
- movsx ebx,ballsydelta
- add _v0r0ty,bx
- movsx ecx,ballsxdelta
- add _v0r0tx,cx
- mov dl,ballsdeltawait
- inc dl
- and dl,7
- mov ballsdeltawait,dl
- jnz short p3m0f1
- cmp _v0r0tz,190
- setl dl
- shl dl,1
- sub dl,1
- add al,dl
- cmp _v0r0ty,0
- setl dl
- shl dl,1
- sub dl,1
- add bl,dl
- cmp _v0r0tx,0
- setl dl
- shl dl,1
- sub dl,1
- add cl,dl
- mov ballszdelta,al
- mov ballsydelta,bl
- mov ballsxdelta,cl
- p3m0f1:
-
- movzx ebx,ballsrot[0] ; rotate glass balls
- add ebx,1
- and bx,1ffh
- mov ballsrot[0],bx
- movzx ecx,ballsrot[2]
- add ecx,2
- and cx,1ffh
- mov ballsrot[2],cx
- movzx edx,ballsrot[4]
- add edx,4
- and dx,1ffh
- mov ballsrot[4],dx
- call _v0rot0init
- mov edi,offset ballscoordsrot
- mov esi,offset ballscoords
- call _v0rot0b
-
- mov edi,ballstblptr ; set up balls for put
- mov esi,offset ballscoordsrot+2
- mov ebx,4
- p3m0l2:
- movzx eax,word ptr [esi+4]
- sub eax,75
- shr eax,2
- cmp eax,63
- jb short p3m0l2f0
- mov byte ptr ballsdata[ebp*4+1],255
- jmp short p3m0l2c
- p3m0l2f0:
- mov byte ptr ballsdata[ebx*4+1],al
- mov ebp,[edi+eax*4]
- movzx edx,byte ptr [ebp+1]
- movzx ecx,byte ptr [ebp]
- shr edx,1
- shr ecx,1
- movsx eax,word ptr [esi+8]
- add eax,100
- sub eax,edx
- imul eax,320
- movsx ebp,word ptr [esi+6]
- sub ebp,ecx
- lea eax,[eax+ebp+160]
- mov word ptr ballsdata[ebx*4+2],ax
- mov byte ptr ballsdata[ebx*4],bl
- p3m0l2c:
- add esi,10
- sub bl,1
- jnc p3m0l2
-
- mov ebp,1 ; sort balls by depth
- mov edx,offset ballsdata+3*4
- p3m0l3:
- mov edi,edx
- lea esi,[edi+4]
- mov ecx,ebp
- mov eax,[edi]
- p3m0l3l0:
- cmp ah,[edi+ecx*4+1]
- ja short p3m0l3l0d
- dec ecx
- jnz p3m0l3l0
- p3m0l3l0d:
- rep movsd
- mov [edi],eax
- sub edx,4
- inc ebp
- cmp ebp,5
- jb p3m0l3
-
- mov esi,4 ; put glass balls to screen
- mov dx,3ceh
- @outw 4005h
- @outb 4
- p3m0l1:
- movzx ebp,byte ptr ballsdata[esi*4+1]
- cmp ebp,62
- ja p3m0l1c
-
- push esi
- lea ebp,[ebp*4]
- add ebp,ballstblptr
- mov ebp,[ebp]
- movzx ecx,byte ptr ballsdata[esi*4]
- mov al,ballscolor[ecx]
- mov ballscoloradd,al
-
- movzx edx,byte ptr [ebp]
- dec edx
- shl edx,16
- movzx ebx,word ptr ballsdata[esi*4+2]
- mov edi,ebx
- shr edi,2
- movzx eax,byte ptr ballsputrout[ecx]
- push edi ebp
- add ebp,2
- call p3m0rout[eax*4]
- pop ebp edi
-
- mov bx,[ebp]
- shr bh,2
- add bh,2
- movzx ecx,ballsnumcur
- mov eax,ballsoldptrcur
- mov [eax+ecx*4],di
- mov [eax+ecx*4+2],bx
- inc ecx
- mov ballsnumcur,cl
-
- pop esi
- p3m0l1c:
- sub esi,1
- jnc p3m0l1
-
- mov dx,3d5h ; set new page
- movzx ebx,ballspageindex
- mov al,ballsnumcur
- mov ballsoldnum[ebx],al
- @outb ballspagetbl[ebx]
- xor bl,1
- mov ballspageindex,bl
-
- mov al,vrtcntr ; wait for a vertical retrace
- waitl0:
- cmp al,vrtcntr
- je waitl0
-
- jmp p3m0seqrout ; jump to appropriate sequence routine
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0sr0: ; wait for slide to normal to end
- cmp _vrtrout,offset p3ir0
- jne p3m0
- movzx eax,ballsindex
- mov ballscolor[eax],0
- sub al,1
- jc p3m0sr0f0
- mov byte ptr ballsputrout[eax],1
- mov ballsindex,al
- mov p3m0seqrout,offset p3m0sr1
- jmp p3m0
- p3m0sr0f0:
- mov p3m0seqrout,offset p3m0sr4
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr1: ; set slide to single color
- mov eax,_cpalptr
- add eax,0a0h*3
- mov ballsdestpalptr,eax
- mov _vrtrout,offset p3ir1
- mov p3m0seqrout,offset p3m0sr2
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr2: ; wait for end slide to single color
- cmp _vrtrout,offset p3ir0
- jne p3m0
- movzx eax,ballsindex
- mov byte ptr ballsputrout[eax],2
- mov p3m0seqrout,offset p3m0sr3
- ;-----------------------------------------------------------------------------
- p3m0sr3: ; set slide to normal color
- mov eax,_cpalptr
- add eax,20h*3
- mov ballsdestpalptr,eax
- mov _vrtrout,offset p3ir1
- mov p3m0seqrout,offset p3m0sr0
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr4: ; wait for muzik meta point
- cmp _muzloc,MUZLOC0
- jb p3m0
- mov p3m0seqrout,offset p3m0sr5
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr5: ; wait for fall to end
- mov al,fallycntr
- or al,al
- jnz p3m0
- inc al
- mov fallycntr,al
- mov p3m0seqrout,offset p3m0sr6
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr6: ; set next fall (if any)
- mov al,fallindex
- sub al,1
- jc p3m0sr6f0
- mov fallindex,al
- mov fallycntr,100
- mov p3m0seqrout,offset p3m0sr5
- jmp p3m0
- p3m0sr6f0:
- mov fallindex,0ffh
- mov p3m0seqrout,offset p3m0sr7
- jmp p3m0
- ;-----------------------------------------------------------------------------
- p3m0sr7: ; end of this part
- mov dx,3d5h ; set page 2
- @outb 80h
-
- mov eax,_ohimembase ; clean up high memory base ptr
- mov _himembase,eax
- mov _vrtrout,offset _ret ; clear retrace routine
-
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3i0r0: ; get a 160x100 bitmap from screen
- add esi,_vidptr0
- xor al,al
- p3i0r0l0:
- out dx,al
- mov ch,100
- p3i0r0l0l0:
- mov cl,40
- p3i0r0l0l0l0:
- movsb
- add edi,3
- dec cl
- jnz p3i0r0l0l0l0
- add esi,40
- dec ch
- jnz p3i0r0l0l0
- sub edi,160*100-1
- sub esi,80*100
- inc al
- and al,3
- jnz p3i0r0l0
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0r0: ; copy into erase areas
- or bl,bl
- jz _ret
- xor ecx,ecx
- xor eax,eax
- p3m0r0l0:
- movzx esi,word ptr [edx]
- lea edi,[ebp+esi]
- add esi,_vidptr2
- mov bh,[edx+3]
- mov al,80
- sub al,bh
- push word ptr [edx+2]
- p3m0r0l0l0:
- mov cl,bh
- rep movsb
- add edi,eax
- add esi,eax
- dec byte ptr [esp]
- jnz p3m0r0l0l0
- add esp,2
- add edx,4
- dec bl
- jnz p3m0r0l0
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0r1: ; put glass ball to screen
- add edi,ballsvidptrcur
- mov dx,3c5h
- movzx eax,bl
- and al,3
- mov al,_vidbitloc2[eax]
- mov ah,4
- mov ecx,_vidptr2
- lea esi,[ecx*4+ebx]
- p3m0r1l0:
- out dx,al
- push eax edx edi
- mov dx,3cfh
- mov ah,ballscoloradd
- p3m0r1l0l0:
- movsx ecx,byte ptr [ebp]
- sub edi,ecx
- movzx ebx,byte ptr [ebp+1]
- jmp p3m0r1rout[ebx*4]
- p3m0r1l0f0:
- irp temp,<15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
- temp2=$
- movzx ebx,word ptr [ebp+&temp*2+2]
- add ebx,esi
- mov al,bl
- and al,3
- out dx,al
- shr ebx,2
- mov al,[ebx]
- add al,ah
- db 88h,47h,&temp ; mov [edi+&temp],al
- P3M0R1LEN=$-temp2
- endm
- movzx ebx,byte ptr [ebp+1]
- lea ebp,[ebp+ebx*2+2]
- lea edi,[edi+ecx+80]
- sub edx,10000h
- jnc p3m0r1l0l0
- pop edi edx eax
- rol al,1
- adc edi,0
- dec ah
- jnz p3m0r1l0
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0r2: ; put ball with no refraction
- add edi,ballsvidptrcur
- mov dh,3
- and ebx,3
- mov ah,4
- p3m0r2l0:
- mov dl,0cfh
- @outb bl
- mov dl,0c5h
- @outb _vidbitloc[ebx]
- push edx edi
- p3m0r2l0l0:
- movsx ecx,byte ptr [ebp]
- sub edi,ecx
- movzx esi,byte ptr [ebp+1]
- jmp p3m0r2rout[esi*4]
- p3m0r2l0f0:
- irp temp,<15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
- temp2=$
- db 80h,47h,&temp,40h ; add byte ptr [edi+&temp],40h
- P3M0R2LEN=$-temp2
- endm
- lea ebp,[ebp+esi*2+2]
- lea edi,[edi+ecx+80]
- sub edx,10000h
- jnc p3m0r2l0l0
- pop edi edx
- inc bl
- and bl,3
- jnz short $+3
- inc edi
- dec ah
- jnz p3m0r2l0
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0r3: ; copy vertical line of BG pic
- mov ebx,edi
- and ebx,3
- @outb _vidbitloc[ebx]
- shr edi,2
- mov esi,edi
- add edi,_vidptr2
- imul ebx,80*200
- add esi,ebx
- add esi,fallbgptr
- mov ah,10
- p3m0r3l0:
- irp temp,<0,1,2,3,4,5,6,7,8,9>
- mov al,[esi+&temp*80]
- mov [edi+&temp*80],al
- endm
- add edi,80*10
- add esi,80*10
- dec ah
- jnz p3m0r3l0
- ret
-
- ;─────────────────────────────────────────────────────────────────────────────
- p3m0r4a: ; fall position for lower left part
- mov ebx,28641f40h
- mov eax,6400a0h
- sub al,fallxcntr
- movzx esi,fallycntr
- lea esi,[esi*4+esi]
- lea esi,[esi*4]
- lea esi,[esi*4+80*100]
- movzx edi,al
- add edi,320*100-2
- ret
- ;-----------------------------------------------------------------------------
- p3m0r4b: ; fall position for upper right part
- mov ebx,28640028h
- mov eax,100
- sub al,fallycntr
- movzx esi,al
- shl eax,16
- mov al,0a0h
- lea esi,[esi*4+esi-5]
- lea esi,[esi*4]
- lea esi,[esi*4+40]
- movzx edi,fallxcntr
- add edi,160
- ret
- ;-----------------------------------------------------------------------------
- p3m0r4c: ; fall position for lower right part
- mov ebx,28641f68h
- mov eax,6400a0h
- movzx esi,fallycntr
- lea esi,[esi*4+esi]
- lea esi,[esi*4]
- lea esi,[esi*4+80*100+40]
- movzx edi,fallxcntr
- add edi,160+320*100
- ret
- ;-----------------------------------------------------------------------------
- p3m0r4d: ; fall position for upper left part
- mov ebx,28640000h
- mov eax,100
- sub al,fallycntr
- movzx esi,al
- shl eax,16
- mov al,160
- sub al,fallxcntr
- lea esi,[esi*4+esi-5]
- lea esi,[esi*4]
- lea esi,[esi*4]
- movzx edi,al
- sub edi,2
- ret
-
-
- code32 ends
- end
-
-